#pragma
#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include <sys/wait.h> 

namespace emotion_as_model
{
    class as_model
    {
    public:
        as_model()
        {
        }
        ~as_model()
        {
        }

    public:
        static void exec_cnnModel()
        {
            /***************************************************************************************************
             *1.在这里会创建子进程，让子进程进行程序的替换操作，替换我们analysis_server目录下的py文件;
             *2.而py文件将会调用我们训练好的模型，模型将会读取我们temp下的input文件，input文件中是事先读入的要分析的言语;
             *3.模型分析结束后，会将分析结果写入我们temp下的output文件，从而实现了大模型函数接口的所有功能;
             *****************************************************************************************************/
            char *args[] = {
                "python3.7",       // Python 解释器名称（execvp 会从 PATH 查找）         
                "predict_text.py", // 模块名（注意：非文件路径）
                NULL               // 参数列表结束标志
            };
            pid_t pid = fork();
            if (pid == 0)
            {
                // 子进程进行程序对的替换
                execvp(args[0], args);
                exit(0);
            }
            else
            {
                // 父进程阻塞等待子进程执行即可
                waitpid(pid, NULL, 0);
            }
        }
        static void start(const std::string &in_json, std::string *out_json)
        {
            Json::Reader reader;
            Json::Value in_value;
            reader.parse(in_json, in_value);
            std::string language = in_value["input"].asString();
            // 将language这些言语数据写入到/temp/input文件中
            FILE *f_w = fopen("./temp/input_file", "w");
            if (!f_w)
            {
                perror("[input_file文件打开失败]");
                exit(0);
            }
            fputs(language.c_str(), f_w);
            fclose(f_w);

            // 最终实现：调用我们的训练的大模型函数接口
            as_model::exec_cnnModel();

            Json::Value out_value;
            Json::StyledWriter writer;
            // 将分析结果从/temp/output文件中读出
            FILE *f_r = fopen("./temp/output_file", "r");
            if (!f_r) {
                perror("[output_file文件打开失败]");
            }
        
            std::string res;
            char buffer[1024];  // 增大缓冲区大小
            while (fgets(buffer, sizeof(buffer), f_r) != NULL) {
                res += buffer;
            }
        
            // 移除字符串末尾的换行符
            if (!res.empty() && res.back() == '\n') {
                res.pop_back();
            }

            fclose(f_r);

            if(res=="高兴"||res=="欣赏"){
                res+=" (积极正向)";
            }else if(res=="惊吓"){
                res="";
                res+="惊讶 (两面中性)";
            }else if(res=="害怕"){
                res="";
                res+="害怕 (两面中性)";
            }else{
                res+=" (负面消极)";
            }

            out_value["status"] = res;
            *out_json = writer.write(out_value);
            // 该蒙古语言语情感为：模型正在分析中...
        }

    private:
    };
}
